package fr.lna.chess.ui;



import java.awt.PopupMenu;
import java.awt.event.WindowListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JToolBar;

import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import fr.lna.chess.type.IMAGE;
import fr.lna.chess.type.ImageManager;
import fr.lna.chess.ui.type.ChessUI;
import fr.lna.chess.util.Message;

/**
 * Classe principale de l'interface graphique Swing du jeu d'échecs.
 * 
 * @author Xavier Rouviere
 */
@Component("main.ui")
final class SwingChessUI implements ChessUI, ApplicationContextAware {
	/** Log de la classe. */
	private Logger log = Logger.getLogger(getClass().getName());

	@Autowired
	@Qualifier("bar.menu")
	private JMenuBar menuBar;

	private JToolBar _toolBar;

	// plutot que Autowired ? à voir
	private ApplicationContext applicationContext;

	@Autowired
	@Qualifier("message.source")
	private Message messageSource;

	@Autowired
	@Qualifier("image.source")
	private ImageManager imageSource;
	

	@Autowired
	@Qualifier("window.listener")
	private WindowListener windowListener;

	private JFrame mainFrame;
	
	/**
	 * Crée une nouvelle instance.
	 */
	public SwingChessUI() {
		super();
	}



	/**
	 * Renvoi une référence vers la barre d'outils.
	 * 
	 * @return Barre d'outils.
	 */
	private JToolBar getToolBar() {
		if (_toolBar == null) {
			final JToolBar barre = new JToolBar();
			barre.setFloatable(false);
			/*
			 * barre.add(getAction(RESET_ACTION)); barre.addSeparator();
			 * barre.add(getAction(LOAD_GAME_ACTION));
			 * barre.add(getAction(SAVE_GAME_ACTION));
			 * barre.add(getAction(SAVE_GAME_AS_ACTION)); barre.addSeparator();
			 * barre.add(getAction(PRINT_ACTION)); barre.addSeparator();
			 * barre.add(getAction(LOAD_POSITION_ACTION));
			 * barre.add(getAction(SAVE_POSITION_ACTION));
			 * barre.add(getAction(SAVE_POSITION_AS_ACTION));
			 * barre.addSeparator(); barre.add(getAction(EXIT_ACTION));
			 * barre.addSeparator(); barre.add(getAction(COPY_ACTION));
			 * barre.add(getAction(PASTE_ACTION)); barre.addSeparator();
			 * barre.add(getAction(HELP_ACTION)); barre.addSeparator();
			 * barre.add(getAction(ABOUT_ACTION));
			 */
			_toolBar = barre;
		}

		return _toolBar;
	}

	/**
	 * Redimensionne la fenetre.
	 */
	/*
	 * private void resizeFrame() { final JFrame fen = getMainFrame();
	 * fen.setResizable(true); _capturesUp.initCapturesPaint();
	 * _capturesDown.initCapturesPaint(); fen.pack(); fen.setResizable(false); }
	 */

	/**
	 * Lance l'interface graphique.
	 * 
	 * @see UI#start()
	 */
	public void start() {
		String titre = messageSource.getMessage("chess.application.title");

		mainFrame = new JFrame(titre);
		mainFrame.setBounds(100, 100, 600, 400);
		mainFrame.setLocationRelativeTo(null);
		mainFrame.setVisible(true);
		mainFrame.addWindowListener(windowListener);
		mainFrame.setIconImage(imageSource.getImage(IMAGE.ICON_PROG).getImage());
		//ajout du menu
		mainFrame.setJMenuBar(menuBar);
		

	}



	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		this.applicationContext = applicationContext;
	}



	@Override
	public JFrame getMainFrame() {
		return mainFrame;
	}
}
